/*
 * @Author: Vorga
 * @LastEditors: Vorga
 */
#ifndef ARRAY_H
#define ARRAY_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define swap(a,b) typeof(a) c=a;a=b;b=c;

typedef int (*CMP)(const void*, const void*);
typedef void (*FUNC)(const void*);

typedef struct Array
{
    //元素长度
    size_t len;
    //元素数量
    size_t cnt;
    void** base;
} Array;

/*
顺序表结构：
    元素存储在一整块连续的内存中。
    优点：
        访问速度快（随机）
        可以使用各种排序算法和二分查找
        不容易产生内存碎片
    缺点：
        插入和删除麻烦
        对内存的要求高
*/

//创建 销毁 添加 插入 删除 修改 查找 排序
Array* create_arr(size_t num);

void destory_arr(Array* arr);

bool add_arr(Array* arr, void* val);

bool insert_arr(Array* arr, size_t index, void* val);

bool del_index_arr(Array* arr, size_t index);

bool del_val_arr(Array* arr, void* val, CMP cmp);

bool mod_index_arr(Array* arr, size_t index, void* val);

bool mod_val_arr(Array* arr, void* old_data, void* new_data, CMP cmp);
//顺序查找
int query_arr_order(Array* arr, void* key, CMP cmp);
//二分查找
int query_arr_binary(Array* arr, void* key, CMP cmp);
//调整参数从而适合递归调用
int _query_arr_binary_re(Array* arr, int min, int max, void* key, CMP cmp);

int query_arr_binary_re(Array* arr, void* key, CMP cmp);

void sort_arr(Array* arr, CMP cmp);
//遍历
void traversal_arr(Array* arr, FUNC func);

void* get_index_arr(Array* arr, int index);
#endif //ARRAY_H
